﻿//2982. 找出出现至少三次的最长特殊子字符串 II
//给你一个仅由小写英文字母组成的字符串 s 。
//如果一个字符串仅由单一字符组成，那么它被称为 特殊 字符串。例如，字符串 "abc" 不是特殊字符串，而字符串 "ddd"、"zz" 和 "f" 是特殊字符串。
//返回在 s 中出现 至少三次 的 最长特殊子字符串 的长度，如果不存在出现至少三次的特殊子字符串，则返回 - 1 。
//子字符串 是字符串中的一个连续 非空 字符序列。



class Solution {
public:
    int maximumLength(string s)
    {
        auto check = [&](int len)->bool
        {
            if (len == 0)  return false;
            unordered_map<char, int> cnt;
            for (int i = 0; i < s.size();)
            {
                int j = i;
                while (j < s.size() && s[i] == s[j])
                {
                    j++;
                }
                if (j - i < len)
                {
                    i = j;
                }
                else
                {
                    cnt[s[i]] += (j - i) - len + 1;
                    if (cnt[s[i]] >= 3)
                    {
                        return true;
                    }
                    i = j;
                }
            }
            return false;

        };

        int left = 1, right = s.size();
        while (left <= right)
        {
            int mid = left + (right - left) / 2;
            if (check(mid))
                left = mid + 1;
            else
                right = mid - 1;
        }
        if (check(left - 1))
            return left - 1;
        return -1;
    }
};